package com.itany.cloud.controller;

import com.itany.cloud.entity.User;
import com.itany.cloud.util.ResponseResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;

/**
 * @author 石小俊
 */
@RestController
@RequestMapping("/users")
public class UserController {

    @Autowired
    private RestTemplate restTemplate;

    private static final String PROVIDER_URL = "http://localhost:8001/users";

    @GetMapping
    public ResponseResult findAll() {
        // 方法返回值:访问的服务提供者响应的数据
        // 参数一:请求地址
        // 参数二:指定响应数据的类型
        // 参数三:请求参数
        // <T> T getForObject(String url, Class<T> responseType, Object... uriVariables)
        return restTemplate.getForObject(PROVIDER_URL, ResponseResult.class);
    }

    @GetMapping("/{id}")
    public ResponseResult findById(@PathVariable Integer id) {
        return restTemplate.getForObject(PROVIDER_URL + "/{id}", ResponseResult.class, id);
    }

    @PostMapping
    public ResponseResult addUser(User user) {
        // 方法返回值:访问的服务提供者响应的数据
        // 参数一:请求地址
        // 参数二:请求信息,MultiValueMap
        // 参数三:指定响应数据的类型
        // 参数四:请求参数
        // <T> T postForObject(String url, @Nullable Object request, Class<T> responseType,Object... uriVariables)
        MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
        params.add("username", user.getUsername());
        params.add("password", user.getPassword());
        return restTemplate.postForObject(PROVIDER_URL, params, ResponseResult.class);
    }

    @PutMapping
    public ResponseResult modifyUser(User user) {
        // 对于put请求与get请求所对应的方法没有返回值
        // 如果需要获取返回值,可以使用通用方法exchange
        // 参数一:请求地址
        // 参数二:请求方式
        // 参数三:请求信息
        // 参数四:相应数据的类型
        // 参数五:请求参数
        // <T> ResponseEntity<T> exchange(String url, HttpMethod method, @Nullable HttpEntity<?> requestEntity,Class<T> responseType, Object... uriVariables)
        String url = new StringBuffer()
                .append(PROVIDER_URL)
                .append("?id={id}")
                .append("&username={username}")
                .append("&password={password}")
                .toString();
        ResponseEntity<ResponseResult> responseEntity = restTemplate.exchange(url, HttpMethod.PUT, null, ResponseResult.class, user.getId(), user.getUsername(), user.getPassword());
        return responseEntity.getBody();
    }


    @DeleteMapping("/{id}")
    public ResponseResult deleteUser(@PathVariable Integer id) {
        ResponseEntity<ResponseResult> responseEntity = restTemplate.exchange(PROVIDER_URL + "/{id}", HttpMethod.DELETE, null, ResponseResult.class, id);
        return responseEntity.getBody();
    }

}
